package cn.gdcp.servicebestpractice;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;

import java.io.File;

public class DownloadService extends Service {
    private DownloadTask downloadTask;
    private String downloadUrl;
    private NotificationManager getNotificationManager(){
        return (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    }
    private Notification getNotification(String s, int progress) {
        Intent intent=new Intent(this,MainActivity.class);
        PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
        NotificationCompat.Builder builder=new NotificationCompat.Builder(this);
        builder.setContentTitle(s);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
        builder.setContentIntent(pi);
        if (progress>0){
            builder.setContentText(progress+"%");
            builder.setProgress(100,progress,false);
        }
        return  builder.build();
    }
   DownloadListener listener=new DownloadListener() {

       public void onProgress(int progress) {
           getNotificationManager().notify(1,getNotification("downloading...",progress));
       }

       public void onSuccess() {
           downloadTask=null;
           stopForeground(true);
           getNotificationManager().notify(1,getNotification("download sucess",-1));
           Toast.makeText(DownloadService.this,"Download Success",Toast.LENGTH_SHORT).show();
       }

       public void onFailed() {
           downloadTask=null;
           stopForeground(true);
           getNotificationManager().notify(1,getNotification("download failed",-1));
           Toast.makeText(DownloadService.this,"Download Failed",Toast.LENGTH_SHORT).show();
       }

       public void onPaused() {
           downloadTask=null;
           Toast.makeText(DownloadService.this,"Download Paused",Toast.LENGTH_SHORT).show();
       }

       @Override
       public void onCanceld() {
           downloadTask=null;
           stopForeground(true);
           Toast.makeText(DownloadService.this,"Download Failed",Toast.LENGTH_SHORT).show();
       }
   };


    private DownloadBinder mBind=new DownloadBinder();
       class  DownloadBinder extends Binder{
         public void startDownload(String url){
             if(downloadTask==null){
                 downloadUrl=url;
                 downloadTask=new DownloadTask(listener);
                 downloadTask.execute(downloadUrl);
                 startForeground(1,getNotification("download...",0));
                 Toast.makeText(DownloadService.this,"Download...",Toast.LENGTH_SHORT).show();
             }
         }
         public void pauseDownload(){
                if (downloadTask!=null){
                    downloadTask.pauseDownload();
                }
         }
         public void cancelDownload(){
             if (downloadTask!=null){
                 downloadTask.cancelDownload();
             }else {
                   if (downloadUrl!=null){
                       String fileName=downloadUrl.substring(downloadUrl.lastIndexOf("/"));
                       String directory= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
                       File file=new File(directory+fileName);
                       if (file.exists()){
                           file.delete();
                       }
                       getNotificationManager().cancel(1);
                       stopForeground(true);
                       Toast.makeText(DownloadService.this,"Canceled",Toast.LENGTH_SHORT).show();
                   }




             }

         }

  }
    public DownloadService() {
    }
    public IBinder onBind(Intent intent) {
          return mBind;
    }
}
